#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10; // 定义数组最大长度
int head, a[N];         // head表示数组的虚拟起始位置，a是存储数据的数组

int main() {
  int n, q; // n: 数组初始长度, q: 操作次数
  cin >> n >> q;

  // 初始化数组，值为1到n
  for (int i = 0; i < n; i++)
    a[i] = i + 1;

  // 处理q个操作
  while (q--) {
    int op; // 操作类型
    cin >> op;

    // 操作1: 修改指定位置的元素值
    if (op == 1) {
      int p, x; // p: 相对位置(从1开始), x: 新值
      cin >> p >> x, p--;
      a[(head + p) % n] = x; // 计算实际位置并赋值
    }
    // 操作2: 查询指定位置的元素值
    else if (op == 2) {
      int p; // p: 相对位置(从1开始)
      cin >> p, p--;
      cout << a[(head + p) % n] << "\n"; // 计算实际位置并输出
    }
    // 操作3: 旋转数组(虚拟地移动起始位置)
    else {
      int k; // k: 旋转的偏移量
      cin >> k;
      head = (head + k) % n; // 更新虚拟起始位置
    }
  }
  return 0;
}